﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>

//typedef struct HashNode
//{
//	int key;
//	int value;
//	struct HashNode* next;
//
//}HashNode;
//int Hash(int key,int prime)
//{
//	return (key-32) % prime;
//}
//int Getprime(int sz)
//{
//	int j = 0;
//	int i = 0;
//	for (i = sz; i >= 2; i--)
//	{
//		for (j = 2; j <= sqrt(i); j++)//sqrt 和 qsort别混淆了
//		{
//			if (i % j == 0)
//			{
//				break;
//			}
//		}
//		if (j > sqrt(i))
//			return i;
//	}
//	return -1;
//}
//HashNode* AollocHashNode(int key,int value)
//{
//	HashNode* p = (HashNode*)malloc(sizeof(HashNode));
//	p->key = key;
//	p->value = value;
//	p->next = NULL;
//	return p;
//}
//int  Creat_HashMap(HashNode* map, int index, int key, int value)
//{
//	HashNode* t = map[index].next;
//	while (t)//每一个key值只能存入一个 先进来的key值得换掉
//	{        //通过哈希同时判断是否重复，并带回之前的value
//		if (t->key == key)
//		{
//			int ret = t->value;
//			t->value = value;
//			return ret + 1;//和返回0区分一下
//		}
//		t = t->next;
//	}
//	HashNode* p = AollocHashNode(key, value);
//	p->next = map[index].next;
//	map[index].next = p;
//	return 0;
//}
////int SearchKey(HashNode* map, int index, int key)
////{
////	HashNode* p = map[index].next;
////	while (p)
////	{
////		if (p->key == key)
////		{
////			return 1;
////		}
////		p = p->next;
////	}
////	return 0;
////}
//void FreeHash(HashNode* map, int prime)
//{
//	int i = 0;
//	for (i = 0; i < prime; i++)
//	{
//		while (map[i].next)
//		{
//			free(map[i].next);
//			map[i].next = NULL;
//		}
//	}
//	free(map);
//}
//
//int lengthOfLongestSubstring(char* s)
//{
//	int len = strlen(s);
//	if (len < 2)
//	{
//		return len;
//	}
//	int prime = Getprime(len);
//	HashNode* map = (HashNode*)malloc(sizeof(HashNode) * prime);
//	memset(map, 0, sizeof(HashNode) * prime);
//	if (NULL == map)
//	{
//		perror("malloc");
//	}
//	int right = 0;
//	int left = 0;
//	int max = 0;
//	while (right < len)
//	{
//		int index = Creat_HashMap(map, Hash(s[right],prime), s[right], right);
//		//重复的话带回之前字符下标，否则返回0
//		//得防止哈希冲突，key得传
//		//pwwkew
//		//窗口缩小 // 通过哈希表来判断是否出现过
//		//int index = SearchKey(map, Hash(s[right], prime), s[right - 1]);
//		while (index)
//		{
//			//记录内部窗口的最大值。
//            //窗口缩小：碰到相同的字符，出窗口，直到窗口中没有重复的字符
//            //需要记录窗口内部的最大值。
//			//if (max < right - left)
//			if (max < right - left)
//			{
//				max = right - left;//窗口的最大值
//				if (index<left)
//					max++;
//			}
//			if(left < index)
//			{
//				left = index;
//			}
//		 //   if (index < left)
//			//{
//			//	left = right;
//			//}
//			break;
//		}
//		right++;//窗口增大
//	}
//	//回收哈希
//	FreeHash(map, prime);
//	max = right - left > max ? right - left : max;//最后一次没碰到呢
//	if (max > 0)
//		return max;
//	return len;
//}
//int main()
//{
//	//char* str = "abcdea";//4-2 aab 012
//	//char* str = "tmmasfgm";//4-2 aab 012
//	//char* str = "cdd";
//	//char* str = "tmmgcahtt";
//	///char* str = "abcb";
//	//char* str = "dvdf";
////	char* str = "wobgrovw";
//	char* str = "pwwkew";
//
//	int ret = lengthOfLongestSubstring(str);
//	printf("%d\n", ret);
//	return 0;
//}
int main()
{
	int a[5][5];
	int(*p)[4];
	p = a;
	printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
	return 0;
}